5 字符串 |
您所在的位置:网站首页 › 下标字符 unicode › 5 字符串 |
5.10 正则表达式
Julia支持正则表达式功能。 Julia的正则表达式采用Perl规则。 正则表达式的写法对初学者比较困难, 这里不进行详细讲解, 读者可以找一本专门讲正则表达式的书, 或者其它编程语言中讲到正则表达式的书。 例如, 本文作者讲R语言的书中有一章讲文本处理, 其中比较详细地讲解了正则表达式的语法, 见: http://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/text.html Julia中正则表达式模式字符串是双撇号界定的特殊字符串开始双撇号之前加r字母作为前缀, 还可以在字符串结尾的双撇号之后增加一些表示选项的字母, 遵从Perl语言的约定, 如i表示不区分大小写, m表示行首和行尾的匹配是针对每一行进行的, s表示句点可以匹配换行符,等等。 比如, pat=r"John"i会不区分大小写地匹配John单词。 加了r前缀的正则表达式中的特殊字符\不需要写成两个, 如r"\w"就表示一个字母、数字、下划线, 而不是写成r"\\w"。 可以用Regex()函数将一个字符串型的表达式转换成正则表达式类型, 这样可以动态地构造正则表达式。 下面的正则表达式对电子邮箱地址进行简单地匹配: pat = r".+@.+" occursin(pat, "[email protected]") ## trueoccursin()仅返回是否匹配。 用match()函数返回匹配结果, 设结果为m, 则m.match()返回匹配的整个字符串, m.offset()返回匹配的开始字符下标, m.offsets()返回匹配的各个子模式的开始字符下标, m.captures()返回匹配的各个子模式。 如 pat = r"([a-zA-Z0-9_.]+)@([a-zA-Z0-9_.]+)" m = match(pat, "[email protected]==") println(m.match) ## [email protected] println(m.offset) ## 3 println(m.offsets) ## [3, 9] println(m.captures) ## Union{Nothing, SubString{String}}["jason", "abc.com"]用findfirst找到某个模式首次出现, findlast找到某个模式最后一次出现, findnext找到某个模式在指定位置之后的首次出现, findprev找到某个模式在指定位置之前的首次出现。 返回值为匹配的字节位置范围。 如: pat = r"([a-zA-Z0-9_.]+)@([a-zA-Z0-9_.]+)" s = "张三:[email protected]; 李四: [email protected]" findfirst(pat, s) ## 10:22 s[10:22] ## "[email protected]" findnext(pat, s, 23) ## 33:43 s[33:43] ## "[email protected]" findlast(".com", s) ## 40:43注意findlast(".com", s)中的.不是正则表达式的通配符, 因为第一个自变量并不是正则表达式。 replace()函数可以用来从字符串中替换某个指定的模式为另外的替换值, 替换字符串使用s前缀的字符串, 也可以用SubstitutionString()将一个字符串型表达式转换成替换字符串类型。 pat = r"([a-zA-Z0-9_.]+)@([a-zA-Z0-9_.]+)" reppat = s"\1-nospam@\2" replace("[email protected]==", pat => reppat) ## "[email protected]=="其中包含s前缀的字符串是替换字符串, \1表示查找到的模式中第一个子模式(第一个左圆括号的分组匹配的内容), \1等的反斜杠不需要重复。 可以用eachmatch()函数提供对对多处匹配的循环, 其结果是一个迭代器(iterator)。如 pat = r"\w+" for imatch in eachmatch(pat, "It is raining.") println("\"$(imatch.match)\"") end ## "It" ## "is" ## "raining"正则表达式中\w代表字母、数字、下划线。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |